package com.xxg.fileshand.greendao;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

import com.blankj.utilcode.util.SPUtils;
import com.github.yuweiguocn.library.greendao.MigrationHelper;
import com.xxg.fileshand.BuildConfig;
import com.xxg.fileshand.app.App;
import com.xxg.fileshand.constant.Constant;

import java.util.List;

/**
 * greenDao操作管理类
 */
public class GreenDaoManager {
    private static DaoSession daoSession;

    /**
     * 初始化GreenDao,直接在Application中进行初始化操作
     */
    public static void initGreenDao(Context context) {
        MigrationHelper.DEBUG = BuildConfig.DEBUG;//数据库升级日志
        GreenDaoUpGradeHelper helper = new GreenDaoUpGradeHelper(context, "files.db");
        SQLiteDatabase db = helper.getWritableDatabase();
        DaoMaster daoMaster = new DaoMaster(db);
        daoSession = daoMaster.newSession();
    }

    public static DaoSession getDaoSession() {
        checkDaoSession();
        return daoSession;
    }

    /**
     * 检查静态变量是否被回收   如果为空则重新创建
     */
    private static void checkDaoSession() {
        if (daoSession == null) {
            initGreenDao(App.getContext());
        }
    }

    public static void addUserDTOList(List<UserDTO> userDTOs) {
        checkDaoSession();
        daoSession.getUserDTODao().insertOrReplaceInTx(userDTOs);
    }

    public static void addUserInfoDTOList(List<UserInfoDTO> userInfoDTOs) {
        checkDaoSession();
        daoSession.getUserInfoDTODao().insertOrReplaceInTx(userInfoDTOs);
    }

    //通过szusername和szpassword查询用户
    public static UserDTO findUser(String szusername, String szpassword) {
        checkDaoSession();
        try {
            return daoSession.getUserDTODao().queryBuilder().where(UserDTODao.Properties.Szusername.eq(szusername), UserDTODao.Properties.Szpassword.eq(szpassword)).list().get(0);
        } catch (Exception e) {
            return null;
        }
    }

    public static UserInfoDTO findUserInfo(String username, String passwordExt) {
        checkDaoSession();
        try {
            return daoSession.getUserInfoDTODao().queryBuilder().where(UserInfoDTODao.Properties.UserName.eq(username), UserInfoDTODao.Properties.PasswordExt.eq(passwordExt)).list().get(0);
        } catch (Exception e) {
            return null;
        }
    }


    public static void deleteUserDTO(UserDTO userDTO) {
        checkDaoSession();
        daoSession.getUserDTODao().delete(userDTO);
    }

    public static void addCaseNoDTOList(List<CaseNoDTO> caseNoDTOs) {
        checkDaoSession();
        daoSession.getCaseNoDTODao().insertOrReplaceInTx(caseNoDTOs);
    }

    public static List<CaseNoDTO> getCaseNoDTOList() {
        checkDaoSession();
        return daoSession.getCaseNoDTODao().queryBuilder().list();
    }

    public static void addCaseCodeDTOList(List<CaseCodeDTO> caseCodeDTOs) {
        checkDaoSession();
        daoSession.getCaseCodeDTODao().insertOrReplaceInTx(caseCodeDTOs);
    }

    public static List<CaseCodeDTO> getCaseCodeDTOList() {
        checkDaoSession();
        return daoSession.getCaseCodeDTODao().queryBuilder().list();
    }

    //通过tid查询case
    public static CaseCodeDTO findCaseCodeDTO(String tid) {
        checkDaoSession();
        try {
            return daoSession.getCaseCodeDTODao().queryBuilder().where(CaseCodeDTODao.Properties.Eid.eq(tid)).list().get(0);
        } catch (Exception e) {
            return null;
        }
    }

    public static CaseCodeDTO findCaseCodeDTO4CaseCode(String caseCode) {
        checkDaoSession();
        try {
            return daoSession.getCaseCodeDTODao().queryBuilder().where(CaseCodeDTODao.Properties.CaseCode.eq(caseCode)).list().get(0);
        } catch (Exception e) {
            return null;
        }
    }

    public static void deleteCaseNoDTO(CaseNoDTO caseNoDTO) {
        checkDaoSession();
        daoSession.getCaseNoDTODao().delete(caseNoDTO);
    }

    public static void addCaseNoDTO(CaseNoDTO caseNoDTO) {
        checkDaoSession();
        daoSession.getCaseNoDTODao().insertOrReplace(caseNoDTO);
    }

    public static void addWzInfoDTOList(List<WzInfoDTO> wzInfoDTOS) {
        checkDaoSession();
        daoSession.getWzInfoDTODao().insertOrReplaceInTx(wzInfoDTOS);
    }

    public static void addFilesInfoDTOList(List<FilesInfoDTO> filesInfoDTOS) {
        checkDaoSession();
        daoSession.getFilesInfoDTODao().insertOrReplaceInTx(filesInfoDTOS);
    }

    //根据szWZCaseNo查找WzInfoDTO
    public static List<WzInfoDTO> findWzInfoDTOList(String szWZCaseNo) {
        checkDaoSession();
        return daoSession.getWzInfoDTODao().queryBuilder().where(WzInfoDTODao.Properties.SzWZCaseNo.eq(szWZCaseNo)).list();
    }

    public static List<WzInfoDTO> findWzInfoDTOListInCase(String szWZCaseNo) {
        checkDaoSession();
        return daoSession.getWzInfoDTODao().queryBuilder().where(WzInfoDTODao.Properties.SzWZCaseNo.eq(szWZCaseNo), WzInfoDTODao.Properties.SzStateName.eq("在馆")).list();
    }

    public static List<FilesInfoDTO> findFilesInfoDTOListInCase(String szWZCaseNo) {
        checkDaoSession();
        return daoSession.getFilesInfoDTODao().queryBuilder().where(FilesInfoDTODao.Properties.CaseCode.eq(szWZCaseNo), FilesInfoDTODao.Properties.BorrowStatus.eq(3)).list();
    }

    //通过tid查询WzInfoDTO
    public static WzInfoDTO findWzInfoDTO(String tid) {
        checkDaoSession();
        try {
            WzInfoDTO wzInfoDTO = daoSession.getWzInfoDTODao().queryBuilder().where(WzInfoDTODao.Properties.TID.eq(tid)).list().get(0);
            WzInfoDTO newWz = new WzInfoDTO();
            newWz.setId(wzInfoDTO.getId());
            newWz.setSzName(wzInfoDTO.getSzName());
            newWz.setSzWZID(wzInfoDTO.getSzWZID());
            newWz.setSzMainWord(wzInfoDTO.getSzMainWord());
            newWz.setSzWZTM(wzInfoDTO.getSzWZTM());
            newWz.setSzStateName(wzInfoDTO.getSzStateName());
            newWz.setSzWZCaseNo(wzInfoDTO.getSzWZCaseNo());
            newWz.setSzWZCaseNoTran(wzInfoDTO.getSzWZCaseNoTran());
            newWz.setTID(wzInfoDTO.getTID());
            return newWz;
        } catch (Exception e) {
            return null;
        }
    }

    public static FilesInfoDTO findFilesInfoDTO(String tid) {
        checkDaoSession();
        try {
            FilesInfoDTO filesInfoDTO = daoSession.getFilesInfoDTODao().queryBuilder().where(FilesInfoDTODao.Properties.Eid.eq(tid)).list().get(0);
            FilesInfoDTO newWz = new FilesInfoDTO();
            newWz.setId(filesInfoDTO.getId());
            newWz.setDaName(filesInfoDTO.getDaName());
            newWz.setDaCode(filesInfoDTO.getDaCode());
            newWz.setBorrowStatus(filesInfoDTO.getBorrowStatus());
            newWz.setCaseCode(filesInfoDTO.getCaseCode());
            newWz.setCaseCodeTrans(filesInfoDTO.getCaseCodeTrans());
            newWz.setEid(filesInfoDTO.getEid());
            return newWz;
        } catch (Exception e) {
            return null;
        }
    }

    //通过tm查询WzInfoDTO
    public static WzInfoDTO findWzInfoDTOByTm(String tm) {
        checkDaoSession();
        try {
            WzInfoDTO wzInfoDTO = daoSession.getWzInfoDTODao().queryBuilder().where(WzInfoDTODao.Properties.SzWZTM.eq(tm)).list().get(0);
            WzInfoDTO newWz = new WzInfoDTO();
            newWz.setId(wzInfoDTO.getId());
            newWz.setSzName(wzInfoDTO.getSzName());
            newWz.setSzWZID(wzInfoDTO.getSzWZID());
            newWz.setSzMainWord(wzInfoDTO.getSzMainWord());
            newWz.setSzWZTM(wzInfoDTO.getSzWZTM());
            newWz.setSzStateName(wzInfoDTO.getSzStateName());
            newWz.setSzWZCaseNo(wzInfoDTO.getSzWZCaseNo());
            newWz.setSzWZCaseNoTran(wzInfoDTO.getSzWZCaseNoTran());
            newWz.setTID(wzInfoDTO.getTID());
            return newWz;
        } catch (Exception e) {
            return null;
        }
    }

    public static List<FilesInfoDTO> findFilesInfoDTOByName(String name) {
        checkDaoSession();
        try {
            return daoSession.getFilesInfoDTODao().queryBuilder().where(FilesInfoDTODao.Properties.DaName.like("%" + name + "%")).list();
        } catch (Exception e) {
            return null;
        }
    }

    public static List<FilesInfoDTO> findFilesInfoDTOByDaCode(String daCode) {
        checkDaoSession();
        try {
            return daoSession.getFilesInfoDTODao().queryBuilder().where(FilesInfoDTODao.Properties.DaCode.like("%" + daCode + "%")).list();
        } catch (Exception e) {
            return null;
        }
    }

    public static void addOfflineRequestDTO(OfflineRequestDTO offlineRequestDTO) {
        checkDaoSession();
        daoSession.getOfflineRequestDTODao().insertOrReplace(offlineRequestDTO);
    }

    //根据时间requestTime 从早到晚排序返回列表
    public static List<OfflineRequestDTO> getOfflineRequestDTOList() {
        checkDaoSession();
        return daoSession.getOfflineRequestDTODao().queryBuilder().orderAsc(OfflineRequestDTODao.Properties.RequestTime).list();
    }

    //删除离线请求
    public static void deleteOfflineRequestDTO(OfflineRequestDTO offlineRequestDTO) {
        checkDaoSession();
        daoSession.getOfflineRequestDTODao().delete(offlineRequestDTO);
    }

    public static void addInventoryTaskDTO(InventoryTaskDTO inventoryTaskDTO) {
        checkDaoSession();
        daoSession.getInventoryTaskDTODao().insertOrReplace(inventoryTaskDTO);
    }

    //获取盘点任务
    public static InventoryTaskDTO getInventoryTaskDTO() {
        checkDaoSession();
        try {
            return daoSession.getInventoryTaskDTODao().queryBuilder().list().get(0);
        } catch (Exception e) {
            return null;
        }
    }

    public static BorrowDTO findBorrowDTO(String readerID) {
        checkDaoSession();
        try {
            return daoSession.getBorrowDTODao().queryBuilder().where(BorrowDTODao.Properties.CardId.eq(readerID)).list().get(0);
        } catch (Exception e) {
            return null;
        }
    }

    public static BorrowDTO findBorrowDTO4Name(String readerName) {
        checkDaoSession();
        try {
            return daoSession.getBorrowDTODao().queryBuilder().where(BorrowDTODao.Properties.CardName.eq(readerName)).list().get(0);
        } catch (Exception e) {
            return null;
        }
    }

    public static void addReadDTOList(List<ReadDTO> readDTO) {
        checkDaoSession();
        daoSession.getReadDTODao().insertOrReplaceInTx(readDTO);
    }

    public static void addBorrowDTO(List<BorrowDTO> borrowDTO) {
        checkDaoSession();
        daoSession.getBorrowDTODao().insertOrReplaceInTx(borrowDTO);
    }


    public static void clearAll(boolean isClearUser) {
        checkDaoSession();
//        daoSession.getCaseNoDTODao().deleteAll();
        daoSession.getCaseCodeDTODao().deleteAll();
        if (isClearUser) {
            daoSession.getUserDTODao().deleteAll();
            SPUtils.getInstance().put(Constant.UPDATE_USER_TIME, "");
        }
//        daoSession.getWzInfoDTODao().deleteAll();
        daoSession.getFilesInfoDTODao().deleteAll();
        daoSession.getOfflineRequestDTODao().deleteAll();
//        daoSession.getInventoryTaskDTODao().deleteAll();
        daoSession.getReadDTODao().deleteAll();
        daoSession.getBorrowDTODao().deleteAll();
        SPUtils.getInstance().put(Constant.UPDATE_CASE_NO_TIME, "");
        SPUtils.getInstance().put(Constant.UPDATE_WZ_INFO_TIME, "");
        SPUtils.getInstance().put(Constant.UPDATE_READ_TIME, "");
        SPUtils.getInstance().put(Constant.CLICK_UPDATE_TIME, "");
    }

}
